﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Text.RegularExpressions;

namespace SMS
{
    public partial class uImportthongtinkhachhang : UserControl
    {
        public readonly long RowsCopied;
        fLogin main;
        public uImportthongtinkhachhang(fLogin main1)
        {
            InitializeComponent();
            main = main1;
            strConn = main.ConnectDB;

        }
       string strConn ;
        DataTable dtbEmailList;
        long totalRowsCount = 0;
        public delegate void RowCopiedHandle(object obj, uImportthongtinkhachhang arg);
        public event RowCopiedHandle OnRowCopied;
        public DataTable ImportEmailList(string FileName, bool hasHeaders)
        {
            //Cho biết trong tập tin Excel có tiêu đề ở mỗi cột hay không
            string HDR = hasHeaders ? "Yes" : "No";
            //Chuỗi kết nối để mở và đọc dữ liệu từ tập tin EXCEL 2003 (yêu cầu máy cài Office 2003)
            string strConn = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR={1};IMEX=1\"", FileName, HDR);
            //Chuỗi kết nối để mở và đọc dữ liệu từ tập tin EXCEL 2007 (yêu cầu máy cài Office 2007 trở lên)
            //string strConn = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR={1};IMEX=1\"", FileName, HDR);

            //DataTable chứa kết quả đọc được
            DataTable outputTable = new DataTable("KHACHHANG");

            using (OleDbConnection conn = new OleDbConnection(strConn))
            {
                conn.Open();

                //Lấy thông tin các sheet có trong tập tin EXCEL
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                //Lấy tên Sheet đầu tiên
                string sheet = dt.Rows[0]["TABLE_NAME"].ToString();



                //Khai báo câu query để đọc nội dung của sheet đầu tiên 
                //(có thể đưa trực tiếp tên sheet vào đây,không cần bước lấy tên sheet ở trên
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn);
                cmd.CommandType = CommandType.Text;

                //Thực hiện đọc và lưu dữ liệu vào DataTable
                new OleDbDataAdapter(cmd).Fill(outputTable);
            }
            return outputTable;
        }
        public bool SaveEmailList(DataTable dtb)
        {
            if (dtb == null)
                return false;

            foreach (DataRow dr in dtb.Rows)
            {
                InsertMail(dr);
            }
            MessageBox.Show("Đã import những khách hàng hợp lệ!");
            return true;
            
        }
        private static readonly string[] VietNamChar = new string[] 
    { 
        "aAeEoOuUiIdDyY", 
        "áàạảãâấầậẩẫăắằặẳẵ", 
        "ÁÀẠẢÃÂẤẦẬẨẪĂẮẰẶẲẴ", 
        "éèẹẻẽêếềệểễ", 
        "ÉÈẸẺẼÊẾỀỆỂỄ", 
        "óòọỏõôốồộổỗơớờợởỡ", 
        "ÓÒỌỎÕÔỐỒỘỔỖƠỚỜỢỞỠ", 
        "úùụủũưứừựửữ", 
        "ÚÙỤỦŨƯỨỪỰỬỮ", 
        "íìịỉĩ", 
        "ÍÌỊỈĨ", 
        "đ", 
        "Đ", 
        "ýỳỵỷỹ", 
        "ÝỲỴỶỸ" 
    };
        public static string LocDau(string str)
        {
            //Thay thế và lọc dấu từng char      
            for (int i = 1; i < VietNamChar.Length; i++)
            {
                for (int j = 0; j < VietNamChar[i].Length; j++)
                    str = str.Replace(VietNamChar[i][j], VietNamChar[0][i - 1]);
            }
            return str;
        }
        public int KiemTraSoKhungTonTai(string sokhung)
        {
            for (int i = 0; i < sokhung.Length; i++)
            {
                string strConn = main.ConnectDB;
                // Khai báo đối tượng dùng kết nối CSDL
                SqlConnection conn = new SqlConnection(strConn);
                SqlCommand commandno = new SqlCommand();
                commandno.Connection = conn;
                commandno.CommandText = "select sokhung from xemay where sokhung=@sokhung";
                commandno.Parameters.Add(new SqlParameter("@sokhung", sokhung[i]));


                try
                {
                    conn.Open();
                    SqlDataReader readerno = commandno.ExecuteReader();
                    readerno.Read();
                    if (readerno[0] != null)
                    {
                        return 1;
                    }

                    if (readerno[0] == null)
                    {
                        return 2;
                    }
                }
                catch
                {
                }
                finally
                {
                    commandno.Dispose();
                    conn.Close();
                }

            }
            return 1;
        }
        int kt = 2;
        public  bool InsertMail(DataRow dr)
        {
           //kt = KiemTraSoKhungTonTai(dr[13].ToString());
           // MessageBox.Show(kt.ToString());
            int count = 0;
            DateTime dateSN;
            //int d=int.Parse(
            string strSqlConn = main.ConnectDB;
                    //Khai báo đối tượng dùng kết nối CSDL
                    SqlConnection conn = new SqlConnection(strSqlConn);
                    //Dùng xoá dữ liệu đang có trong bảng Email của SQL Database
                  
            if (dr[13].ToString() == null || dr[13].ToString() == "" )
            {
                MessageBox.Show("Khách hàng "+ dr[1]+ " có số CMND "+ dr[0]+" chưa có số khung xe ! ");
                return false;
            }

            else
            {
                if (dr[7].ToString() == null || dr[7].ToString() == "" || dr[8].ToString() == null || dr[8].ToString() == "")
                {
                    
                    //Khai báo thông tin kết nối đến SQL Database
                    //string strSqlConn = "Data source=QUYEN-PC;Database=SMS_SYSTEM;User ID=sa;Password=123456";
                    //Khai báo đối tượng dùng kết nối CSDL
                    //SqlConnection conn = new SqlConnection(strSqlConn);
                    //Dùng xoá dữ liệu đang có trong bảng Email của SQL Database
                    SqlCommand command = new SqlCommand();
                    command.Connection = conn;
                    command.CommandText = "INSERT INTO KHACHHANG(HOTEN,BIDANH,GIOITINH,DIACHI,NGAYSINH,NAMSINH,THANGSINH,DTDIDONG,DTNHA,TINHTP,QUANHUYEN,NGHENHIEP,CMND,TINHTRANG,SINHNHAT) VALUES (@Ten,@Bidanh,@Gioitinh,@Dchi,@Ngaysinh,@Namsinh,@Thangsinh,@DTDD,@DTNha,@Tinhtp,@Quanhuyen,@NgheNghiep,@CMND,@TINHTRANG,@sn)";
                    //command.CommandText = "SP_THEMKHACHHANG (@Ten,@Gioitinh,@Dchi,@Ngaysinh,@Namsinh,@Thangsinh,@DTDD,@DTNha,@Tinhtp,@Quanhuyen,@NgheNghiep,@CMND,@TINHTRANG)";


                    command.Parameters.Add(new SqlParameter("@TINHTRANG", "yes"));
                    command.Parameters.Add(new SqlParameter("@Ten", dr[1].ToString()));
                    command.Parameters.Add(new SqlParameter("@CMND", dr[0].ToString()));
                    command.Parameters.Add(new SqlParameter("@Bidanh", LocDau( dr[2].ToString())));
                    command.Parameters.Add(new SqlParameter("@Dchi", dr[3].ToString()));
                    command.Parameters.Add(new SqlParameter("@Quanhuyen", dr[4].ToString()));
                    command.Parameters.Add(new SqlParameter("@Tinhtp", dr[5].ToString()));
                    command.Parameters.Add(new SqlParameter("@Gioitinh", dr[6].ToString().ToUpper()));
                    command.Parameters.Add(new SqlParameter("@Ngaysinh", DBNull.Value));
                    command.Parameters.Add(new SqlParameter("@Thangsinh", DBNull.Value));
                    command.Parameters.Add(new SqlParameter("@Namsinh", int.Parse(dr[9].ToString())));
                    command.Parameters.Add(new SqlParameter("@NgheNghiep", dr[10].ToString()));
                    command.Parameters.Add(new SqlParameter("@DTDD", dr[11].ToString()));
                    command.Parameters.Add(new SqlParameter("@DTNha", dr[12].ToString()));
                    command.Parameters.Add(new SqlParameter("@sn", DBNull.Value));

                    
                    try
                    {
                        //Mở kết nối
                        conn.Open();
                        //Thực thi việc thêm dữ liệu. kết quả trả về biến count là số dòng dữ liệu được thêm 
                        // (trong trường hợp này, nếu thành công thì có 1 dòng dữ liệu được thêm vào Database)
                        count = command.ExecuteNonQuery();
                        // command2.ExecuteNonQuery();
                        totalRowsCount++;
                        if (totalRowsCount % 500 == 0)
                        {
                            OnRowCopied(this, new uImportthongtinkhachhang(main));
                        }

                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show("Thông tin khách hàng " + dr[1].ToString() + " Có số CMND " + dr[0].ToString() + " không hợp lệ!");

                    }
                    finally
                    {
                        conn.Close();
                        ThemCMNDKhiImPort(dr[13].ToString(), dr[0].ToString());

                    }
                    
                    if (count == 1)
                    {
                        return true;
                    }

                    else
                        return false;
                    
                }
                else
                {
                    //MessageBox.Show("hehe");
                    dateSN = new DateTime(int.Parse(dr[9].ToString()), int.Parse(dr[8].ToString()), int.Parse(dr[7].ToString()));

                    SqlCommand command = new SqlCommand();
                    command.Connection = conn;
                    command.CommandText = "INSERT INTO KHACHHANG(HOTEN,BIDANH,GIOITINH,DIACHI,NGAYSINH,NAMSINH,THANGSINH,DTDIDONG,DTNHA,TINHTP,QUANHUYEN,NGHENHIEP,CMND,TINHTRANG,SINHNHAT) VALUES (@Ten,@Bidanh,@Gioitinh,@Dchi,@Ngaysinh,@Namsinh,@Thangsinh,@DTDD,@DTNha,@Tinhtp,@Quanhuyen,@NgheNghiep,@CMND,@TINHTRANG,@sn)";

                    command.Parameters.Add(new SqlParameter("@TINHTRANG", "yes"));
                    command.Parameters.Add(new SqlParameter("@Ten", dr[1].ToString()));
                    command.Parameters.Add(new SqlParameter("@CMND", dr[0].ToString()));
                    command.Parameters.Add(new SqlParameter("@Bidanh",LocDau(dr[2].ToString())));
                    command.Parameters.Add(new SqlParameter("@Dchi", dr[3].ToString()));
                    command.Parameters.Add(new SqlParameter("@Quanhuyen", dr[4].ToString()));
                    command.Parameters.Add(new SqlParameter("@Tinhtp", dr[5].ToString()));
                    command.Parameters.Add(new SqlParameter("@Gioitinh", dr[6].ToString().ToUpper()));
                    command.Parameters.Add(new SqlParameter("@Ngaysinh", int.Parse(dr[7].ToString())));
                    command.Parameters.Add(new SqlParameter("@Thangsinh", int.Parse(dr[8].ToString())));
                    command.Parameters.Add(new SqlParameter("@Namsinh", int.Parse(dr[9].ToString())));
                    command.Parameters.Add(new SqlParameter("@NgheNghiep", dr[10].ToString()));
                    command.Parameters.Add(new SqlParameter("@DTDD", dr[11].ToString()));
                    command.Parameters.Add(new SqlParameter("@DTNha", dr[12].ToString()));
                    command.Parameters.Add(new SqlParameter("@sn", dateSN));

                    //command2.Parameters.Add(new SqlParameter("@CMND", dr[0]));
                    //command2.Parameters.Add(new SqlParameter("@SOKHUNG", dr[13]));
                    try
                    {
                        //Mở kết nối
                        conn.Open();
                        //Thực thi việc thêm dữ liệu. kết quả trả về biến count là số dòng dữ liệu được thêm 
                        // (trong trường hợp này, nếu thành công thì có 1 dòng dữ liệu được thêm vào Database)
                        count = command.ExecuteNonQuery();
                        // command2.ExecuteNonQuery();
                        totalRowsCount++;
                        if (totalRowsCount % 500 == 0)
                        {
                            OnRowCopied(this, new uImportthongtinkhachhang(main));
                        }
                       //MessageBox.Show("thanh cong");
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show("Thông tin khách hàng " + dr[1].ToString() + " Có số CMND "+ dr[0].ToString() +" không hợp lệ!");
                    }
                    finally
                    {
                        conn.Close();
                        ThemCMNDKhiImPort(dr[13].ToString(), dr[0].ToString());
                        

                    }
                    
                    if (count >= 1)
                    {
                        return true;
                        
                    }

                    else
                        return false;
                }

               
            }
         
            
            
        }
        public static string ConvertToUnSign(string text)
        {

            for (int i = 32; i < 48; i++)
            {

                text = text.Replace(((char)i).ToString(), " ");

            }

            text = text.Replace(".", "-");

            text = text.Replace(" ", "-");

            text = text.Replace(",", "-");

            text = text.Replace(";", "-");

            text = text.Replace(":", "-");



            Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");



            string strFormD = text.Normalize(System.Text.NormalizationForm.FormD);

            return regex.Replace(strFormD, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');

        }
        private void ThemCMNDKhiImPort(string strSource, string cmnd)
        {
            
            string[] SoKhung_CMND = strSource.Split(',');
            for (int i = 0; i < SoKhung_CMND.Length; i++)
            {
                SqlConnection conn2 = new SqlConnection(main.ConnectDB);
                SqlCommand command2 = new SqlCommand();
                command2.Connection = conn2;
                command2.CommandText = "UPDATE XEMAY SET CMND= @CMND, NGAYMUA= GETDATE() where SOKHUNG=@SOKHUNG and CMND is null ";
                command2.Parameters.Add(new SqlParameter("@CMND", cmnd));
                //command2.Parameters.Add(new SqlParameter("@ngaymua",mua));
                command2.Parameters.Add(new SqlParameter("@SOKHUNG", SoKhung_CMND[i]));

                //MessageBox.Show("Du lieu: " + cmnd + "----" + mua + "---" + SoKhung_CMND[i]);

                try
                {
                    conn2.Open();
                    
                    command2.ExecuteNonQuery();
                    
                }
                catch (Exception ex)
                {
                    
                }
                finally
                {
                    command2.Dispose();
                    conn2.Close();
                }
            }

        }
        private void bntChonFile_Click(object sender, EventArgs e)
        {
            
            string fileName;
            DialogResult result = open.ShowDialog();
            if (result == DialogResult.OK)
            {
                fileName = open.FileName;
                txtImport.Text = fileName;
                dtbEmailList = ImportEmailList(fileName, true);
                if (dtbEmailList != null)
                {
                    dataGridView1.DataSource = dtbEmailList;
                }
            }
            bntSave.Enabled = true;
        }
        private void uImportthongtinkhachhang_Load(object sender, EventArgs e)
        {
            bntSave.Enabled = false;
            dataGridView1.DataSource = null;
            txtImport.ResetText();
        }
        void db_OnrowCopied(object obj, uImportthongtinkhachhang arg)
        {
            long rowsCopied = arg.RowsCopied;
            int value = (int)((rowsCopied * 1.0 / dtbEmailList.Rows.Count) * 100);
            backgroundWorker1.ReportProgress(value);
        }
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            SaveEmailList(dtbEmailList);
        }
        private void bntHuy_Click(object sender, EventArgs e)
        {
            dataGridView1.DataSource = null;
            txtImport.ResetText();
            bntSave.Enabled = false;

        }
        private void bntSave_Click(object sender, EventArgs e)
        {
         
            backgroundWorker1.RunWorkerAsync();
            dataGridView1.DataSource = null;
            txtImport.ResetText();
            bntSave.Enabled = false;
            main.Danhsachkhachhang.uDanhsachkhachhang_Load(null, null);
        }
    }
}
